package com.soryin.dao.impl;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.soryin.dao.BaseDao;

/**
 * 数据库基本操作实现
 * @author Hello_海生
 * @date 2014年3月12日
 * @param <T>
 */
@SuppressWarnings("unchecked")
public class BaseDaoImpl<T> implements BaseDao<T> {
	//声明Session工厂
	@Resource
	private SessionFactory sessionFactory;
	protected Session getSession() {	//获取session
		return this.sessionFactory.openSession();
	}
	
	protected Class<T> c;	//对象类
	public BaseDaoImpl() {
		ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
		c = (Class<T>) type.getActualTypeArguments()[0];
		System.out.println("初始化"+this.c.getName()+"DAO");
	}
	
	
	
	@Override	//持久化对象
	public Serializable save(T entity) {
		Serializable uid=(Integer) this.getSession().save(entity);
		System.out.println(this.c.getName()+"DAO"+"执行save 成功！");
		return uid;
	}

	@Override	//删除对象
	public void delete(Serializable id) {
		this.getSession().delete(this.findById(id));
		System.out.println(this.c.getName()+"DAO"+"执行 delete("+id+") 成功！");
	}

	@Override	//根据ID 查询对象
	public T findById(Serializable id) {
		Object t = this.getSession().get(this.c, id);
		System.out.println(this.c.getName()+"DAO"+"执行 findById("+id+") 成功！");
		return (T) t;
	}

	
	@Override	//查询所有对象
	public List<T> findAll() {
		Query query=this.getSession().createQuery("from User");
		System.out.println(this.c.getName()+"DAO"+"执行  findAll");
		return (List<T>)query.list();
	}
	
	@Override	//查询分页
	public List<T> findByPage(int start,int count){  
        Criteria criteria = this.getSession().createCriteria(c);  
        criteria.setFirstResult(start);  
        criteria.setMaxResults(count);  
        return criteria.list();  
    }  



	@Override
	public void update(T entity) {
		this.getSession().update(entity);
		System.out.println(this.c.getName()+"DAO"+"执行update 成功！");
	}

}
